package com.test1.controller;

import com.alibaba.fastjson.JSON;
import com.test1.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.UUID;

@CrossOrigin//解决跨域注解
@RestController
public class UserContorller {

    /**
     * 原生参数接收
     * @param request 原生请求
     * @param response 原生响应
     * @param session 原生会话
     * @return 页面名称
     */
    @RequestMapping("/index1")
    public String show1 (HttpServletRequest request, HttpServletResponse response, HttpSession session){
        String username = request.getParameter("usernaem");
        String age = request.getParameter("age");
        System.out.println(username);
        System.out.println(age);
        return "hello";
    }
    /**
     * 形参接收
     * @param usernam 用户名
     * @param age 年龄
     * @return 页面名称
     * 页面中提供的参数可以直接绑定在形参中，直接使用形参接收即可，并且数据类型也可以帮助我进行转换，但是如果类型不匹配，会报错
     * 注意：页面中传递的参数key必须和方法形参的变量名一致，否则无法接收到参数
     */
    @RequestMapping("/inderx2")
    public String show2(String usernam ,int age){
        System.out.println(usernam);
        System.out.println(age);
        return "index.xml";
    }
    /**
     * @RequestParam注解
     * @param username
     * @param age
     * @return
     *
     * 注意：当页面中传递的参数key与方法形参名不一致，可以通过@RequestParam注解来指定参数名，但是注意：如果参数名一致，则无需指定@RequestParam注解，直接使用形参接收即可
     */
    @PostMapping("/index3")
    public String show3 (@RequestParam("name") String username, @RequestParam("userage") int age){
        System.out.println(username);
        System.out.println(age+5);
        return "index.xml";
    }
    /**
     * 形参接收对象
     * @param user
     * @return
     * 注意：形参接收对象，对象中的属性名必须和页面中传递的参数名一致，否则接收不到参数，并且数据类型也必须一致，否则接收不到参数
     */
    @RequestMapping("index4")
    public String show4(User user) {
        System.out.println(user.getUsername());
        System.out.println(user.getAge());
        return "index.xml";
    }
    /**
     * 形参接收对象，同时接受一个变量
     * @param u
     * @param hobby
     * @return
     *
     * 注意：这没什么可注意的
     */
    @RequestMapping("/index5")
    public  String show5(User u,String hobby){
        System.out.println(u.getUsername());
        System.out.println(u.getAge());
        System.out.println(hobby);
        return "index.xml";
    }
    /**
     * 形参接收数组
     * @param hobby
     * @return
     *
     * 注意：页面中会传递相同key的参数，例如：hobby=a&hobby=b&hobby=c，此时hobby是一个数组，数组中存放了所有的hobby值
     */
    @RequestMapping("index6")
    public String show6(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "index.xml";
    }
    /**
     * 形参接收集合
     * @param hobby
     * @return
     *
     * 注意：当方法形参为集合类型时，SpringMVC会将它视作对象进行处理，所以在接受页面中参数的时候，需要使用@RequestParam注解来指定参数名，否则会报错
     */
    @RequestMapping("index7")
    public  String show7(@RequestParam("hobby") ArrayList<String> hobby){
        System.out.println(hobby.toString());
        return "index.html";
    }

    /**
     * 形参接收对象集合
     * @param users
     * @return
     *
     * 注意：通常在接受对象集合时，前端传递的参数都是JSON类型的，所以使用@RequestBody注解标记接受的是纯文本信息
     */
    @RequestMapping("index8")
    public  String show8 (@RequestBody ArrayList<User> users){
        System.out.println(users.toString());
        return "index,xml";
    }
    /**
     * 使用forward转发
     * @param u
     * @return
     *
     *
     */
    @RequestMapping("inde9")
    public  String show9 (User u) {
        System.out.println(u.toString());
        return "forward:index.html";
    }
    /**
     * 使用redirect重定向
     * @param u
     * @return
     *
     */
    @RequestMapping("/index10")
    public String show10(User u){
        System.out.println("-----index10");
        System.out.println(u.toString());
        return "redirect:index.html";
    }

    /**
     * 使用ModelAndView作为响应内容
     * @param u
     * @return
     *
     * 比较
    @RequestMapping("/index11")
    public ModelAndView show11(User u){
        ModelAndView mav = new ModelAndView();
        mav.addObject("user", u);
        mav.setViewName("index.html");
        return mav;
    }
    /**
     * 使用@ResponseBody注解返回JSON
     * @param u
     * @return
     *
     * 最常使用，也是前后端分离模式中最重要的数据传输方式
     */
    @ResponseBody
    @RequestMapping("/index12")
    public String show12(User u){
        // JSON.parseObject("前端或数据库中取出的JSON字符串", User.class); JSON转对象，通常是后台用
        User user = JSON.parseObject("{\"username\":\"张三\",\"age\":18}", User.class);
        System.out.println(user.getUsername());
        System.out.println(user.getAge());

        // JSON.toJSONString(对象); 对象转JSON字符串，通常是后台给前端响应时用
        // String jsonString = JSON.toJSONString(u);
        return JSON.toJSONString(u);
    }

    @RequestMapping("/fileupload")
    public String show13(MultipartFile uploadfile){
        String filename = uploadfile.getOriginalFilename();
        filename = UUID.randomUUID()+filename;
        return null;
    }

}
